package org.dromara.device.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.device.api.domain.vo.OrdinaryDeviceVo;
import org.dromara.device.domain.DeviceConfig;
import org.dromara.device.domain.bo.DeviceBo;
import org.dromara.device.domain.bo.DeviceConfigBo;
import org.dromara.device.domain.bo.DeviceInfoBo;
import org.dromara.device.domain.vo.DeviceConfigVo;
import org.dromara.device.domain.vo.DeviceInfoVo;
import org.dromara.device.domain.vo.DeviceVo;

import java.util.Collection;
import java.util.List;

/**
 * 设备管理-设备配置信息Service接口
 *
 * @author samuel
 * @date 2024-03-21
 */
public interface IDeviceConfigService {

    /**
     * 查询设备管理-设备配置信息
     */
    DeviceConfigVo queryById(Long deviceId);

    /**
     * 查询设备管理-设备配置信息列表
     */
    TableDataInfo<DeviceConfigVo> queryPageList(DeviceConfigBo bo, PageQuery pageQuery);

    /**
     * 查询设备管理-设备配置信息列表
     */
    List<DeviceConfigVo> queryList(DeviceConfigBo bo);

    /**
     * 新增设备管理-设备配置信息
     */
    Boolean insertByBo(DeviceConfigBo bo);

    /**
     * 修改设备管理-设备配置信息
     */
    Boolean updateByBo(DeviceConfigBo bo);

    /**
     * 校验并批量删除设备管理-设备配置信息信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    TableDataInfo<DeviceVo> queryTableList(DeviceBo bo, PageQuery pageQuery);

    /**
     * 绑定设备与门店以及门店分区的关系
     * @param bo    设备对象
     */
    int bindDevice(DeviceBo bo);

    /**
     * 修改设备与门店以及门店分区的关系
     * @param bo        设备对象
     */
    int updateBindBo(DeviceBo bo);

    int remove(List<Long> deviceIds);

    void updateBatchStatusByDeviceSn(List<DeviceConfig> deviceVos);

    /**
     * 根据设备编码集合查询在线的设备列表
     * @param deviceSns     设备编码集合
     */
    List<DeviceConfigVo> selectOnlineByDeviceSnList(String[] deviceSns);

    /**
     * 根据设备id列表查询设备列表
     * @param deviceIds     设备id列表
     * @return              设备列表
     */
    List<DeviceConfigVo> selectByDeviceIds(List<Long> deviceIds);

    List<OrdinaryDeviceVo> queryByStoreIds(List<Long> storeIds);

    /**
     * 根据门店分组查询设备列表
     * @param bo    设备对象
     * @return      设备列表
     */
    List<DeviceInfoVo> groupStore(Page<DeviceInfoVo> page, DeviceInfoBo bo);

    /**
     * 查询绑定的门店的设备
     * @return      设备集合
     */
    List<DeviceConfigVo> selectByNotStoreId();

    /**
     * 通过门店解绑设备与门店的关系
     * @param storeId   门店id
     * @return          解绑设备与门店的关系
     */
    boolean unbindByStoreId(Long storeId);
}
